package com.lxit.cms.action.admin.assist.cn.compent;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import com.lxit.cms.action.admin.assist.cn.msg.MsgDeliver;
import com.lxit.cms.action.admin.assist.cn.msg.MsgSubmit;
import com.lxit.cms.action.admin.assist.cn.util.SysteLog;
import com.lxit.cms.action.admin.assist.cn.util.Utils;
/**
 * 1.启停命令提供
 * 2.接受合法IP来的连结请求
 * @desc: 
 * @project:蓝杰中国移动Cmpp短信网关项目开发 Jun 17, 2009
 * @author: 蓝杰www.netjava.cn
 */
public class ISMGServer {
	//ISMG中保存的SP对象表
	// key为spId,值为sp企业配置对象
	private Map<String,SPCompany> spMapByIP=new java.util.HashMap();
	// key为spCode:即key为Sp特服号,值为sp企业配置对象
	private Map<String,SPCompany> spMapBySPCode=new java.util.HashMap();
	
	//保存接收到所有sp发来的submit消息队列
	private List<MsgSubmit> submitsResult=new ArrayList();
	//保存所有己发送的Deliver消息
	private List<MsgDeliver> deliversResult=new ArrayList();
	
	 
	public ISMGServer(){
		 
	}
	
   
	/**
	 * 在网关配置中加入一个SP企业配置对象
	 * @param sp
	 */
	 public void addSp(SPCompany sp){
			 spMapByIP.put(sp.getSpIP(),sp);
			 spMapBySPCode.put(sp.getSpCode(), sp);
	 }
	 
	 
	 //发送一条消息:发给SP的一条手机发送上来的消息
	 public boolean sendDeliver(String srcMobile,String msg,String desSp){
		 SPCompany sp=spMapBySPCode.get(desSp);
		return sp.sendMsg(srcMobile, msg, desSp);
	 }
	 
	 /**
	  * 返回己发送成功，即收到应答的Deliver消息
	  * @return
	  */
	 public List<MsgDeliver> getSendedDeliver(){
		 java.util.List<MsgDeliver> dl=new ArrayList();
		synchronized(this.deliversResult){
			dl.addAll(deliversResult);
			deliversResult.clear();
		}
		return dl;
	 }
	 
	 
	 /**
	  * 返回己回应答接收到的Submit消息
	  * @return
	  */
	 public List<MsgSubmit> getReciveMsgSubmit(){
		 java.util.List<MsgSubmit> dl=new ArrayList();
		synchronized(this.submitsResult){
			dl.addAll(submitsResult);
			submitsResult.clear();
		}
		return dl;
	 }
	 
	 
	/**
	 * 在指定端口上启动服务器
	 * @param port
	 */
	public void startISMG(int port){
		try{
//           //构造一个独立网络地址:
			java.net.InetSocketAddress iad=new java.net.InetSocketAddress("192.168.1.147",port);
	       java.net.InetAddress ia=iad.getAddress(); 
//			//绑到到服务器上指定的IP地址
    java.net.ServerSocket sc=new java.net.ServerSocket(7890,10,ia);
	SysteLog.INFO("服务器端口绑定OK:", sc.getLocalSocketAddress().toString());
		while(true){
			java.net.Socket client=sc.accept();
			SysteLog.INFO("进入一个连结",client.getRemoteSocketAddress().toString());
			//进入了一个SP连结,得得进入的客户端ip
			String ip=Utils.parseIP(client.getRemoteSocketAddress().toString());
			SysteLog.INFO("此连结的ip是",ip);
			SPCompany sp=spMapByIP.get(ip);
			if(null!=sp){//是合法ip地址进来的连结
				SysteLog.INFO("合法ip地址的连结进入",ip);
			//包装为cmpp连结对象
			CMPPConntor conn=new CMPPConntor(client,submitsResult,deliversResult);
			//将这个连结加入到sp企业对象的连结列表中
			sp.addConn(conn);
			}else{//不是合法的ip进来的,断开
				client.close();
				SysteLog.INFO("非法ip地址的连结进入!!!",ip);
			}
	        }
		
		}catch(Exception ef){
			ef.printStackTrace();
		}
		
	 
	}
	
	 

}
